package routes

import (
	"context"
	"github.com/gin-gonic/gin"
	swaggerFiles "github.com/swaggo/files"
	ginSwagger "github.com/swaggo/gin-swagger"
	"go-admin/app/controllers/system"
	"go-admin/app/global/app"
	"go-admin/app/middleware"
	"time"
)

var userControllers = system.NewUserController()                       // 用户控制器
var authControllers = system.NewAuthController()                       // 认证控制器
var sysMenuControllers = system.NewSysMenuController()                 // 菜单控制器
var sysDeptControllers = system.NewSysDeptController()                 // 部门控制器
var sysRoleControllers = system.NewSysRoleController()                 // 角色控制器
var sysDictControllers = system.NewSysDictController()                 // 字典控制器
var sysDictItemControllers = system.NewSysDictItemController()         // 字典项控制器
var sysApiControllers = system.NewSysApiController()                   // API控制器
var sysFileControllers = system.NewSysFileController()                 // 文件管理
var configControllers = system.NewConfigController()                   // 配置控制器
var sysOperationLogControllers = system.NewSysOperationLogController() // 操作日志控制器
var sysTenantControllers = system.NewTenantController()                // 租户控制器
var sysUserTenantControllers = system.NewSysUserTenantController()     // 用户租户关联控制器

// InitRoutes 初始化路由
func InitRoutes(engine *gin.Engine) {
	// 静态文件
	engine.Static(app.ConfigYml.GetString("httpserver.serverRootPath"),
		app.ConfigYml.GetString("httpserver.serverRoot"))

	//	调试模式下注册Swagger路由、查看内存缓存项
	if app.ConfigYml.GetBool("server.debug") {
		// 注册Swagger路由
		engine.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
		// 查看内存缓存项
		engine.GET("/viewCache", func(ctx *gin.Context) {
			items, err := app.Cache.GetAll(context.Background())
			if err != nil {
				ctx.JSON(500, gin.H{"error": "获取缓存项失败", "details": err.Error()})
				return
			}
			ctx.JSON(200, items)
		})
	}

	// 全局跨域中间件
	if app.ConfigYml.GetBool("httpserver.allowCrossDomain") {
		engine.Use(middleware.CorsNext())
	}

	// 全局操作日志中间件
	if app.ConfigYml.GetBool("server.syslog") {
		engine.Use(middleware.OperationLogMiddleware())
	}

	// 全局超时中间件
	handlerTimeout := app.ConfigYml.GetInt("httpserver.handlerTimeout")
	if handlerTimeout > 0 {
		engine.Use(middleware.TimeoutMiddleware(time.Duration(handlerTimeout) * time.Second))
	}

	api := engine.Group("/api")
	{
		{
			// 公开路由
			public := api.Group("")
			public.POST("/login", middleware.CaptchaMiddleware(), authControllers.Login)
			public.POST("/refreshToken", authControllers.RefreshToken)
			// 生成验证码ID
			public.GET("/captcha/id", authControllers.GetCaptchaId)
			// 获取验证码图片
			public.GET("/captcha/image", authControllers.GetCaptchaImg)
			// 获取配置信息
			public.GET("/config/get", configControllers.GetConfig)

			// 受保护的路由
			protected := api.Group("")
			protected.Use(middleware.JWTAuthMiddleware())
			protected.Use(middleware.DemoAccountMiddleware()) // 添加演示账号中间件
			protected.Use(middleware.CasbinMiddleware())
			{
				// 用户管理路由组
				users := protected.Group("/users")
				{
					// 获取当前登录用户信息
					users.GET("/profile", userControllers.GetProfile)
					// 用户列表
					users.GET("/list", userControllers.List)

					// 根据ID获取用户信息
					users.GET("/:id", userControllers.GetUserByID)
					// 新增用户
					users.POST("/add", middleware.PasswordValidatorMiddleware(), userControllers.Add)
					// 更新用户信息
					users.PUT("/edit", middleware.PasswordValidatorMiddleware(), userControllers.Update)
					// 删除用户
					users.DELETE("/delete", userControllers.Delete)
					// 用户登出
					users.POST("/logout", authControllers.Logout)
					// 更新当前登录用户密码、邮箱及手机号
					users.PUT("/updateAccount", middleware.PasswordValidatorMiddleware(), userControllers.UpdateAccount)
					// 上传用户头像
					users.POST("/uploadAvatar", userControllers.UploadAvatar)
					// 更新当前登录用户基本信息
					users.PUT("/updateBasicInfo", userControllers.UpdateBasicInfo)
				}

				// 系统菜单路由组
				sysMenu := protected.Group("/sysMenu")
				{
					// 获取当前用户有权限的菜单数据不含按钮
					sysMenu.GET("/getRouters", sysMenuControllers.GetRouters)
					// 获取完整的菜单列表
					sysMenu.GET("/getMenuList", sysMenuControllers.GetMenuList)
					// 根据ID获取菜单信息
					sysMenu.GET("/:id", sysMenuControllers.GetByID)
					// 新增菜单
					sysMenu.POST("/add", sysMenuControllers.Add)
					// 更新菜单
					sysMenu.PUT("/edit", sysMenuControllers.Update)
					// 删除菜单
					sysMenu.DELETE("/delete", sysMenuControllers.Delete)
					// 根据菜单ID获取API ID集合
					sysMenu.GET("/apis/:id", sysMenuControllers.GetMenuApiIds)
					// 为菜单分配API权限
					sysMenu.POST("/setApis", sysMenuControllers.SetMenuApis)
					// 导出菜单数据
					sysMenu.GET("/export", sysMenuControllers.Export)
					// 导入菜单数据
					sysMenu.POST("/import", sysMenuControllers.Import)
				}

				// 系统部门路由组
				sysDept := protected.Group("/sysDept")
				{
					// 部门列表
					sysDept.GET("/getDivision", sysDeptControllers.GetDivision)
					// 根据ID获取部门信息
					sysDept.GET("/:id", sysDeptControllers.GetByID)
					// 新增部门
					sysDept.POST("/add", sysDeptControllers.Add)
					// 更新部门
					sysDept.PUT("/edit", sysDeptControllers.Update)
					// 删除部门
					sysDept.DELETE("/delete", sysDeptControllers.Delete)
				}

				// 系统角色路由组
				sysRole := protected.Group("/sysRole")
				{
					// 获取所有角色数据（树形结构）
					sysRole.GET("/getRoles", sysRoleControllers.GetRoles)
					// 根据角色ID获取角色菜单权限
					sysRole.GET("/getUserPermission/:roleId", sysRoleControllers.GetUserPermission)
					// 为角色分配菜单权限
					sysRole.POST("/addRoleMenu", sysRoleControllers.AddRoleMenu)
					// 角色分页列表
					sysRole.GET("/list", sysRoleControllers.List)
					// 根据ID获取角色信息
					sysRole.GET("/:id", sysRoleControllers.GetByID)
					// 新增角色
					sysRole.POST("/add", sysRoleControllers.Add)
					// 更新角色
					sysRole.PUT("/edit", sysRoleControllers.Update)
					// 删除角色
					sysRole.DELETE("/delete", sysRoleControllers.Delete)
					// 更新角色数据权限
					sysRole.PUT("/dataScope", sysRoleControllers.UpdateDataScope)

				}

				// 系统字典路由组
				sysDict := protected.Group("/sysDict")
				{
					// 获取所有字典数据（包含关联字典项）
					sysDict.GET("/getAllDicts", sysDictControllers.GetAllDicts)
					// 根据字典编码获取字典及其字典项
					sysDict.GET("/getByCode/:code", sysDictControllers.GetDictByCode)
					// 字典分页列表
					sysDict.GET("/list", sysDictControllers.List)
					// 根据ID获取字典信息
					sysDict.GET("/:id", sysDictControllers.GetByID)
					// 新增字典
					sysDict.POST("/add", sysDictControllers.Add)
					// 更新字典
					sysDict.PUT("/edit", sysDictControllers.Update)
					// 删除字典
					sysDict.DELETE("/delete", sysDictControllers.Delete)
				}

				// 系统字典项路由组
				sysDictItem := protected.Group("/sysDictItem")
				{
					// 字典项列表（无分页）
					sysDictItem.GET("/list", sysDictItemControllers.List)
					// 根据ID获取字典项信息
					sysDictItem.GET("/:id", sysDictItemControllers.GetByID)
					// 根据字典ID获取字典项列表
					sysDictItem.GET("/getByDictId/:dictId", sysDictItemControllers.GetByDictID)
					// 根据字典编码获取字典项列表
					sysDictItem.GET("/getByDictCode/:dictCode", sysDictItemControllers.GetByDictCode)
					// 新增字典项
					sysDictItem.POST("/add", sysDictItemControllers.Add)
					// 更新字典项
					sysDictItem.PUT("/edit", sysDictItemControllers.Update)
					// 删除字典项
					sysDictItem.DELETE("/delete", sysDictItemControllers.Delete)
				}

				// 系统API路由组
				sysApi := protected.Group("/sysApi")
				{
					// API列表
					sysApi.GET("/list", sysApiControllers.List)
					// 根据ID获取API信息
					sysApi.GET("/:id", sysApiControllers.GetByID)
					// 新增API
					sysApi.POST("/add", sysApiControllers.Add)
					// 更新API
					sysApi.PUT("/edit", sysApiControllers.Update)
					// 删除API
					sysApi.DELETE("/delete", sysApiControllers.Delete)
				}

				// 系统文件附件路由组
				sysFile := protected.Group("/sysFile")
				{
					// 上传文件
					sysFile.POST("/upload", sysFileControllers.Upload)
					// 删除文件
					sysFile.DELETE("/delete", sysFileControllers.Delete)
					// 修改文件名
					sysFile.PUT("/updateName", sysFileControllers.UpdateName)
					// 文件列表（分页查询）
					sysFile.GET("/list", sysFileControllers.List)
					// 根据ID获取文件信息
					sysFile.GET("/:id", sysFileControllers.GetByID)
					// 获取文件URL
					sysFile.GET("/download/:id", sysFileControllers.Download)
				}

				// 系统配置路由组
				config := protected.Group("/config")
				{

					// 更新配置信息
					config.PUT("/update", configControllers.UpdateConfig)

				}

				// 操作日志路由组
				sysOperationLog := protected.Group("/sysOperationLog")
				{
					// 操作日志列表
					sysOperationLog.GET("/list", sysOperationLogControllers.List)
					// 删除操作日志
					sysOperationLog.DELETE("/delete", sysOperationLogControllers.Delete)
					// 导出操作日志
					sysOperationLog.GET("/export", sysOperationLogControllers.Export)
				}

				// 租户管理路由组
				sysTenant := protected.Group("/sysTenant")
				{
					// 租户列表
					sysTenant.GET("/list", sysTenantControllers.List)
					// 根据ID获取租户信息
					sysTenant.GET("/:id", sysTenantControllers.GetByID)
					// 新增租户
					sysTenant.POST("/add", sysTenantControllers.Add)
					// 更新租户
					sysTenant.PUT("/edit", sysTenantControllers.Update)
					// 删除租户
					sysTenant.DELETE("/:id", sysTenantControllers.Delete)
				}

				// 用户租户关联管理路由组
				sysUserTenant := protected.Group("/sysUserTenant")
				{
					// 用户租户关联列表
					sysUserTenant.GET("/list", sysUserTenantControllers.List)
					// 根据用户ID和租户ID获取用户租户关联信息
					sysUserTenant.GET("/get", sysUserTenantControllers.GetByID)
					//批量新增用户租户关联
					sysUserTenant.POST("/batchAdd", sysUserTenantControllers.BatchAdd)
					//批量删除用户租户关联
					sysUserTenant.DELETE("/batchDelete", sysUserTenantControllers.BatchDelete)
					// 用户列表(不限租户)
					sysUserTenant.GET("/userListAll", sysUserTenantControllers.UserListAll)
					// 角色列表(不限租户)
					sysUserTenant.GET("/getRolesAll", sysUserTenantControllers.GetRolesAll)
					// 根查询角色ID集合(不限租户)
					sysUserTenant.GET("/getUserRoleIDs", sysUserTenantControllers.GetUserRoleIDs)
					// 设置用户角色(不限租户)
					sysUserTenant.POST("/setUserRoles", sysUserTenantControllers.SetUserRoles)
				}
			}

		}
	}
}
